﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<vector>

//某班有 n个学生，编号 1∼n。
//他们上学期的编程成绩分别为 a1, a2, …, an。他们本学期的编程成绩分别为 b1, b2, …, bn。
//请你判断，是否有学生出现成绩退步的情况。
//输入格式
//第一行包含整数 n。
//第二行包含 n个整数 a1, a2, …, an。
//第三行包含 n个整数 b1, b2, …, bn。
//
//输出格式
//如果有学生出现成绩退步的情况，则输出 YES，否则，输出 NO。

//int main()
//{
//	int n;
//	cin >> n;
//	vector<int>A(n), B(n);
//	for (int i = 0; i < n; i++)
//	{
//		cin >> A[i];
//	}
//	for (int i = 0; i < n; i++)
//	{
//		cin >> B[i];
//	}
//	int flag = 0;
//	for (int i = 0; i < n; i++)
//	{
//		if (B[i] < A[i])
//		{
//			cout<<"Yes"<<endl;
//			flag = 1;
//			break;
//		}
//	}
//	if (flag)
//	{
//		cout << "NO" << endl;
//	}
//	
//	return 0;


//贝茜盖了一面长方形的墙，该墙恰好由 N×M个边长为 1的正方形砖块堆叠而成。
//作为一头缺乏生活常识的奶牛，它并不懂得使用水泥等胶凝材料让墙变得坚固。所以仅仅一场台风，就让该墙变为了残垣断壁。
//墙面上的一些砖块还存在（用 B 表示），另一些砖块已经消失了（用.表示）。
//受重力影响，每个幸存的砖块要么位于地面上（最下面一行），要么位于另一块砖块的顶部，不会出现浮空而立的超自然情况。
//给定墙面的现状，请你分析当前墙面中一共包含多少个由砖块构成的连通块。
//每个砖块视为与其上、下、左、右四个邻近砖块相连。
//
//输入格式
//第一行包含两个整数 N, M。
//
//接下来 N行，包含一个 N×M的由 B 和.构成的字符矩阵，表示整面墙体的当前状况。
//
//输入保证至少存在一个砖块。
//
//输出格式
//一个整数，表示当前墙面中包含的由砖块构成的连通块的数量。

//void Search(vector<vector<int>>& A, int i, int j)
//{
//	if (i<0 || i>A.size() || j<0 || j>A[0].size() || A[i][j] == '.' || A[i][j] == 'F')
//	{
//		return;
//	}
//	A[i][j] = 'F';
//
//	Search(A, i + 1, j);
//	Search(A, i + 1, j);
//	Search(A, i, j + 1);
//	Search(A, i, j - 1);
//}
//
//int main()
//{
//
//	int N, M;
//	cin >> N >> M;
//	vector<vector<char>>A(N, vector<char>(M));
//	for (int i = 0; i < N; i++)
//	{
//		for (int j = 0; j < M; j++)
//		{
//			cin >> A[i][j];
//		}
//	}
//
//	int count = 0;
//
//	for (int i = 0; i < N; i++)
//	{
//		for (int j = 0; j < M; j++)
//		{
//			if (A[i][j] == 'B')
//			{
//				Search(A, i, j);
//				count++;
//			}
//		}
//	}
//	cout << count << endl;
//	return 0;
//}


//约翰计划在农田附近盖一栋 H层的高楼。楼层自下而上依次编号为 1∼H。
//为了防止奶牛们集体反对，约翰需要贿赂两头奶牛头目----贝茜和贝蒂。
//约翰和两头奶牛约定，在高楼建成后，约翰需要挑选其中的 N个楼层送给贝茜，M个楼层送给贝蒂。
//显然，一个楼层最多只能送给一头奶牛。
//贝茜不喜欢能被质数 x整除的数字，因此它不接受编号能被 x整除的楼层。
//贝蒂不喜欢能被质数 y整除的数字，因此它不接受编号能被 y整除的楼层。
//
//请你计算，为了让两头奶牛都能满意从而使得高楼可以顺利搭建，这栋高楼至少需要盖多少层，即请你计算满足条件的 H的最小可能值。
//
//输入格式
//共一行，包含四个整数 N, M, x, y。
//
//输出格式
//一个整数，表示 H的最小可能值。

int gcd(int a, int b)//最大公约数
{
	if (b == 0)//a是除数，b是余数
	{
		return a;
	}
	return gcd(b, a % b);
}

int Lcm(int x, int y)//最小公倍数
{
	return x * y / gcd(x, y);
}
//
//int main()
//{
//	int N, M, x, y;
//	cin >> N >> M >> x >> y;
//
//	int num = Lcm(x, y);
//	if (num - 1 <= N + M)
//	{
//		cout << N + M + 1 << endl;
//	}
//	else
//	{
//		cout << num - 1 << endl;
//	}
//	return 0;
//}//错误代码，勿学